package com.lxmes.common.utils;

import java.math.BigDecimal;

public class HrGeneraRuleUtils {
    /*
     * @工资合计
     * @param 参数：基本工资，岗位工资，绩效工资
     * */
    public static BigDecimal gzhj(BigDecimal jbgz,BigDecimal gwgz,BigDecimal jxgz){
        return jbgz.add(gwgz).add(jxgz);
    }

    /*
     * @应发基本工资
     * @param 参数：加班天数，基本工资，考勤计算基数
     * =IF(U3>=0,AB3,AB3+AB3/O3*U3)
     * */
    public static BigDecimal yfjbgz(double jbNum,BigDecimal attendCalBase,BigDecimal jbgz){
        BigDecimal yfjbgz = new BigDecimal(0);
        if(jbNum>=0){
            yfjbgz = jbgz;
        }else {
            BigDecimal multiply = jbgz.divide(attendCalBase).multiply(new BigDecimal(jbNum));
            yfjbgz = jbgz.add(multiply);
        }
        return yfjbgz;
    }

    /*
     * @应发岗位工资
     * @@param 参数：加班天数，岗位工资，考勤计算基数
     * =IF(U3>=0,AC3,AC3+AC3/O3*U3)
     * */
    public static BigDecimal yfgwgz(double jbNum,BigDecimal zrgwWages,BigDecimal attendCalBase){
        BigDecimal yfgwgz = new BigDecimal(0);
        if(jbNum>=0){
            yfgwgz = zrgwWages;
        }else{
            BigDecimal multiply = zrgwWages.divide(attendCalBase).multiply(new BigDecimal(jbNum));
            yfgwgz = zrgwWages.add(multiply);
        }
        return yfgwgz;
    }

    /*
     * @应发绩效工资
     * @@param 参数：加班天数，绩效工资，考勤计算基数
     * IF(U3>=0,AD3,AD3+AD3/O3*U3)
     * */
    public static BigDecimal yfjxgz(double jbNum,BigDecimal jxWages,BigDecimal attendCalBase){
        BigDecimal yfjxgz = new BigDecimal(0);
        if(jbNum>=0){
            yfjxgz = jxWages;
        }else{
            BigDecimal multiply = jxWages.divide(attendCalBase).multiply(new BigDecimal(jbNum));
            yfjxgz = jxWages.add(multiply);
        }
        return yfjxgz;
    }
    /*
     * @应发加班工资
     * @@param 参数：加班天数，抵完休/假班后的拖班小时,基本工资,岗位工资,考勤计算基数
     * IF(U3>=0,(T3+(U3*8))*(AB3+AC3)/O3/8,T3*(AB3+AC3)/O3/8)
     * */
    public static BigDecimal workOverTime(double jbNum,BigDecimal dxwTime,BigDecimal jbgz,BigDecimal zrgwWages,BigDecimal attendCalBase){
        double v = 0;
        if(dxwTime==null){
            dxwTime = new BigDecimal(0);
        }
        if(jbgz==null){
            jbgz = new BigDecimal(0);
        }
        if(zrgwWages==null){
            zrgwWages = new BigDecimal(0);
        }
        if(attendCalBase==null){
            return new BigDecimal(0);
        }

        if(jbNum>=0){
            v = (dxwTime.doubleValue() + (jbNum * 8))* (jbgz.doubleValue() + zrgwWages.doubleValue()) / attendCalBase.doubleValue() / 8;
        }else{
            v = dxwTime.doubleValue() * (jbgz.doubleValue() + zrgwWages.doubleValue()) / attendCalBase.doubleValue() / 8;
        }
        return new BigDecimal(v);
    }


    /*
     * @月度工资（小时）
     * @@param 参数：实到小时，小时工资
     *
     * */
    public static BigDecimal ydgz(BigDecimal sdxs,BigDecimal xsgz){
        BigDecimal v =new BigDecimal(0);
        int i = sdxs.compareTo(v);
        if(sdxs!=null&&i>0){
            v = sdxs.multiply(xsgz);
        }
        return v;
    }

    /*
     * @应纳税所得额
     * @param 参数：累计工资额，累计扣除数，累计社保，子女教育，赡养老人，住房贷款利息，住房租金，继续教育
     * */
    public static BigDecimal ynssde(BigDecimal ljgz,BigDecimal ljkcs,BigDecimal ljsb,BigDecimal znjy,BigDecimal sylr,BigDecimal zfdklx,BigDecimal zfzj,BigDecimal jxjy){
        BigDecimal res = new BigDecimal(0);
        BigDecimal add = ljkcs.add(ljsb).add(znjy).add(sylr).add(zfdklx).add(zfzj).add(jxjy);
        int i = ljgz.compareTo(add);
        if(i > 0){
            res =  ljgz.subtract(add);
        }
        return res;
    }

    /*
     * @税率/预扣率
     * @param 参数：应纳税所得额
     * */
    public static BigDecimal slAndykl(BigDecimal ynssde){
        double taxRate = 0;
        double v = ynssde.doubleValue();
        if(v>0&&v<=36000){
            taxRate = 0.03;
        }else if(v>36000&&v<=144000){
            taxRate = 0.1;
        }else if(v>144000&&v<=300000){
            taxRate = 0.2;
        }else if(v>300000&&v<=420000){
            taxRate = 0.25;
        }else if(v>420000&&v<=660000){
            taxRate = 0.3;
        }else if(v>660000&&v<=960000){
            taxRate = 0.35;
        }else if(v>960000){
            taxRate = 0.45;
        }
        return new BigDecimal(taxRate);
    }

    /*
     * @速算扣除数
     * @param 参数：税率/预扣率
     *
     * */
    public static BigDecimal sskcs(double taxRate){
        int res = 0;
        if(taxRate<=0.03){
            res = 0;
        }else if (taxRate==0.1){
            res = 2520;
        }else if(taxRate==0.2){
            res = 16920;
        }else if(taxRate==0.25){
            res = 31920;
        }else if(taxRate==0.3){
            res = 52920;
        }else if(taxRate==0.35){
            res = 85920;
        }else{
            res = 181920;
        }
        return new BigDecimal(res);
    }

    /*
     * @应纳税额
     * @param 参数：税率/预扣率
     * ROUND(R2*S2-T2,2)
     * 应纳税所得额*税率/预扣率-速算扣除数
     * */
    public static BigDecimal ynse(BigDecimal ynssde,double rate,BigDecimal sskcs){
        BigDecimal subtract = ynssde.multiply(new BigDecimal(rate)).subtract(sskcs);
        return new BigDecimal(round(subtract, 2, BigDecimal.ROUND_HALF_UP));
    }

    public static String round(BigDecimal b, int scale, int round_mode) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        return b.setScale(scale, round_mode).toString();
    }

    /*
    * 应补/退税额
    * @param 应纳税额 已缴税额
    * */
    public static BigDecimal balance(BigDecimal ynse,BigDecimal yjse){

        BigDecimal subtract = ynse.subtract(yjse);
        int i = subtract.compareTo(new BigDecimal(0));
        if(i>=0){
            return subtract;
        }else {
            return new BigDecimal(0);
        }


    }


}
